package cashpointer.web.support;

import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.core.io.ClassPathResource;

/**
 * Klasa wspomagajaca pobieranie danych z pliku core.properties
 * @author wojciech topolski
 * @version 2009-03-25
 */
public class PropertyStoreUtil implements PropertyStore {

    // Logger.
	private static Log log = LogFactory.getLog(PropertyStoreUtil.class);

    // Kontener wlasnosci.
    private Map<String, String> properties;

    /**
     * Funkcja zwraca wartosc parametru o podanej nazwie. Parametry zapisane
     * sa w pliku "core.properties".
     * @param name String
     * @return String
     */
    public String getPropertyByName(String name) {
        if (properties == null) {
            properties = new HashMap<String, String>();

            // Sciezka do pliku.
            ClassPathResource pathCoreProperties = new ClassPathResource("web.properties");
            if (pathCoreProperties != null) {
                try {
                    // Pobieram input stream dla pliku.
                    InputStream inputStreamCoreProperties = pathCoreProperties.getInputStream();

                    try {
                        // Pobieram zawartosc z pliku.
                        ResourceBundle resource = new PropertyResourceBundle(inputStreamCoreProperties);

                        // Pobieram wszystkie wpisy z pliku.
                        Enumeration<String> keys = resource.getKeys();
                        if (keys != null) {
                            while (keys.hasMoreElements()) {
                                // Klucz.
                                String key = keys.nextElement();

                                // Wartosc.
                                String value = resource.getString(key);

                                if (key != null && value != null && value.length() > 0) {
                                    properties.put(key, value);
                                }
                            }
                        }
                    }
                    catch (IOException ioe) {
                        if (log.isErrorEnabled()) {
                            log.error("[PropertyStoreUtil::getPropertyByName(String name)] Blad podczas pobierania resource.", ioe);
                        }
                    }
                }
                catch (IOException ioe) {
                    if (log.isErrorEnabled()) {
                        log.error("[PropertyStoreUtil::getPropertyByName(String name)] Blad podczas pobierania inputStreamCoreProperties.", ioe);
                    }
                }
            }
            else {
                if (log.isErrorEnabled()) {
                    log.error("[PropertyStoreUtil::getPropertyByName(String name)] pathCoreProperties jest null.");
                }
            }
        }

        // Jesli kontener nie zostal utworzony
        if (properties == null) {
            if (log.isErrorEnabled()) {
                log.error("[PropertyStoreUtil::getPropertyByName(String name)] Brak kontenera");
            }

            return null;
        }

        // Zwrocenie wartosci jesli znajduje sie w kontenerze.
        if (properties.containsKey(name)) {
            return properties.get(name);
        }
        else {
            if (log.isErrorEnabled()) {
                log.error("[PropertyStoreUtil::getPropertyByName(String name)] Brak wartosci dla: " + name);
            }

            return null;
        }
    }
}
